﻿using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Persistencia_y_capa_de_negocio;
using System.Text.RegularExpressions;

namespace clonegame
{
    public partial class formularioRecursoEditar : UserControl
    {
        private static readonly formularioRecursoEditar instancia = new formularioRecursoEditar();

        public static formularioRecursoEditar Instancia
        {
            get { return instancia; }
        }

        public formularioRecursoEditar()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Quita toda la información del formulario para que se pueda
        /// añadir otro edificio.
        /// </summary>
        public void BorraForm()
        {
            tbNombre.Text = "";
            tbRatio.Text = "";
            tbDescripcion.Text = "";
            pbImg.ImageLocation = "";
        }

        public void cargarDatos(string nombre, string ratio, string descripcion)
        {
            tbNombre.Text = nombre;
            tbRatio.Text = ratio;
            tbDescripcion.Text = descripcion;

            string mdf = Application.ExecutablePath;
            mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));

            string mdf2 = mdf.Remove(mdf.LastIndexOf(@"\clonegame"));
            mdf2 += @"\clonegame\imagenes\recursos\";
            try
            {
                pbImg.Image = System.Drawing.Image.FromFile(mdf2 + nombre + ".png");
                pbImg.ImageLocation = mdf2 + nombre + ".png";
            }
            catch (Exception)
            {
                pbImg.Image = clonegame.Properties.Resources.RecursoNoEncontrado;
            }
        }

        private void btEditar_Click(object sender, EventArgs e)
        {
            formularioMaestro form = formularioMaestro.Instancia;

            // Error por campos incompletos
            bool error = false; 
            // Error por poner datos incorrectos
            bool error2 = false;

            string errorString = "Los siguientes campos están vacios: ";

            string errorString2 = "Error: ";
            string regexp = @"^\d+";

            if (tbNombre.Text == "")
            {
                error = true;
                errorString += "Nombre ";
            }
            if (tbRatio.Text == "")
            {
                error = true;
                errorString += "Ratio ";
            }
            if (tbDescripcion.Text == "")
            {
                error = true;
                errorString += "Descripción ";
            }
            if (pbImg.ImageLocation == "")
            {
                error = true;
                errorString += "Imagen ";
            }

            if (Regex.Match(tbRatio.Text.ToString(), regexp).Success == false)
            {
                error2 = true;
                errorString2 += "Este campo solo admite números";
            }

            try
            {
                int test = Convert.ToInt32(tbRatio.Text);
            }
            catch(Exception ex)
            {
                errorString2 += ex.Message.ToString();
                error2 = true;
            }

            if (!error && !error2)
            {
                epGuardar.SetError(btEditar, "");
                epRatio.SetError(tbRatio, "");

                formularioRecursos.Instancia.Estado = "editar";

                ENRecurso recurso = new ENRecurso();
                ENActividad act = new ENActividad();

                recurso.Nombre = tbNombre.Text;
                recurso.Ratio = Convert.ToInt32(tbRatio.Text);
                recurso.Descripcion = tbDescripcion.Text;
                recurso.Admin = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;

                if (CADRecurso.Instancia.InsertarRecurso(recurso))
                {
                    MessageBox.Show("Recurso creado correctamente", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    // Copiamos su imagen para posterior uso.

                    string origen = pbImg.ImageLocation;
                    string destino = Application.ExecutablePath;
                    destino = destino.Remove(destino.LastIndexOf(@"\bin\"));
                    destino += @"\imagenes\recursos";
                    destino += @"\" + tbNombre.Text + ".png";

                    // Código para trasladar la imágen también a la web.
                    string destinoWeb = Application.ExecutablePath;
                    destinoWeb = destinoWeb.Remove(destinoWeb.LastIndexOf(@"\clonegame\"));
                    destinoWeb += @"\webclonegame\FormulariosPrivada\ImagenesPrivada\recursos";
                    destinoWeb += @"\" + tbNombre.Text + ".png";

                    

                    File.Copy(origen, destino);
                    File.Copy(origen, destinoWeb);

                    act.Accion = "Alta";
                    act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                    act.Descripcion = "Ha dado de alta un nuevo recurso.";
                    act.Fecha = DateTime.Now.ToString();

                    CADActividad.Instancia.InsertarActividad(act);
                }
                else
                {
                    string origen = pbImg.ImageLocation;
                    string destino = Application.ExecutablePath;
                    destino = destino.Remove(destino.LastIndexOf(@"\bin\"));
                    destino += @"\imagenes\recursos";
                    destino += @"\" + tbNombre.Text + ".png";

                    if (File.Exists(destino) && destino != origen)
                    {
                        pbImg.Image.Dispose();
                        ((Image)formularioRecursos.Instancia.dgvRecursos.SelectedRows[0].Cells[0].Value).Dispose();

                        System.GC.Collect();
                        System.GC.WaitForPendingFinalizers();

                        File.Delete(destino);

                        File.Copy(origen, destino);
                    }
                    

                    act.Accion = "Modificación";
                    act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                    act.Descripcion = "Ha modificado el recurso " + tbNombre.Text + ".";
                    act.Fecha = DateTime.Now.ToString();

                    CADActividad.Instancia.InsertarActividad(act);

                    
                    pbImg.Image = Image.FromFile(destino);

                }

                // Actualizamos el DGV de bienvenida.
                formularioBienvenida.Instancia.actualizaResumen();

                formularioRecursos.Instancia.RellenaDGV(true);
            }
            else if(error)
            {
                epGuardar.SetIconAlignment(btEditar, ErrorIconAlignment.MiddleLeft);
                epGuardar.SetError(btEditar, errorString);
                if (error2)
                {
                    epGuardar.SetIconAlignment(tbRatio, ErrorIconAlignment.MiddleRight);
                    epRatio.SetError(tbRatio, errorString2);
                }
                else
                {
                    epRatio.SetError(tbRatio, "");
                }
            }
            else if (error2)
            {
                epGuardar.SetIconAlignment(tbRatio, ErrorIconAlignment.MiddleRight);
                epRatio.SetError(tbRatio, errorString2);
            }
            else
            {
                epRatio.SetError(tbRatio, "");
            }
        }

        private void btBuscar_Click(object sender, EventArgs e)
        {
            formularioRecursos form = formularioRecursos.Instancia;

            form.MuestraForm(formularioRecursoBuscar.Instancia);
        }

        /// <summary>
        /// Al hacer click en examinar, elegimos una imagen que se guardará
        /// al guardar todo el formulario, mientras usaremos la que está 
        /// en el disco del usuario.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btExaminarI_Click(object sender, EventArgs e)
        {
            OpenFileDialog imagen = new OpenFileDialog();
            imagen.Filter = "png (*.png)|*.png";
            pbImg.SizeMode = PictureBoxSizeMode.StretchImage;

            formularioRecursos.Instancia.Estado = "editando";

            if (imagen.ShowDialog() == DialogResult.OK)
            {
                // Hemos seleccionado una imagen.
                // Ahora queremos copiarla.

                string origen = imagen.FileName;
                string destino = Application.ExecutablePath;
                destino = destino.Remove(destino.LastIndexOf(@"\bin\"));
                destino += @"\imagenes\edificios";
                destino += @"\" + tbNombre.Text + ".png";
                //File.Copy(origen, destino);

                //pbImg.Image = System.Drawing.Image.FromFile(origen);
                pbImg.ImageLocation = imagen.FileName;

                // MessageBox.Show(destino);
            }
            
        }

        private void EstEditando(object sender, KeyEventArgs e)
        {
            formularioRecursos.Instancia.Estado = "editando";
        }
    }
}
